mmserv/metadatautility/Src/MetaDataUtilityBody.h
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/metadatautility/Src/MetaDataUtilityBody.h	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,329 @@
+/*
+* 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 implementation body for the API specified
+*                by CMetaDataUtility.
+*
+*/
+
+
+
+#ifndef CMETADATAUTILITYBODY_H
+#define CMETADATAUTILITYBODY_H
+
+// INCLUDES
+#include <e32base.h>
+#include <MetaDataField.hrh>
+#include <f32file.h>
+#include <MDUChunkDataObserver.h>
+
+// FORWARD DECLARATION
+class CMetaDataFieldContainer;
+class CMetaDataParser;
+class CMetaDataSource;
+class MMDUChunkDataObserver;
+class CMetaDataBufferAgg;
+
+// LITERALS & CONSTANTS
+
+_LIT8(KAmrMimeType, "audio/amr");
+_LIT8(KAwbMimeType, "audio/amr-wb");
+_LIT8(KMpegMimeType, "audio/mpeg");
+_LIT8(KMp3MimeType, "audio/mp3");
+_LIT8(KMp4AudioMimeType, "audio/mp4");
+_LIT8(K3gpAudioMimeType, "audio/3gpp");
+_LIT8(K3g2AudioMimeType, "audio/3gpp2");
+_LIT8(KAacMimeType, "audio/aac");
+_LIT8(KMidiMimeType, "audio/midi");
+_LIT8(KWmaMimeType, "audio/x-ms-wma");
+_LIT8(KRmfMimeType, "audio/x-beatnik-rmf");
+_LIT8(KRApnMimeType, "audio/x-pn-realaudio");
+_LIT8(KRArnMimeType, "audio/vnd.rn-realaudio");
+_LIT8(KRAxMimeType, "audio/x-realaudio");
+
+// CLASS DECLARATION
+
+/**
+*  This class implements the API specified by CMetaDataUtility.
+*
+*  @lib MetaDataUtility.lib
+*  @since 3.0
+*/
+class CMetaDataUtilityBody : public CBase
+	{
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+		* @return A pointer to a new instance of this class
+        */
+        static CMetaDataUtilityBody* NewL();
+
+        /**
+        * Destructor.
+        */
+        virtual ~CMetaDataUtilityBody();
+
+    public: // New functions
+
+        /**
+        * Opens and reads metadata from the specified file.
+        * @since 3.0
+		* @param aFileName The name of the file
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @return void
+        */
+		void OpenFileL( const TDesC& aFileName, const RArray<TMetaDataFieldId>& aWantedFields );
+
+		/**
+        * Opens and reads metadata from the specified file handle
+        * @since 3.0
+		* @param aFile File handle already open
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @return void
+        */
+		void OpenFileL(RFile& aFile, const RArray<TMetaDataFieldId>& aWantedFields );
+
+        /**
+        * Reads metadata from the specified descriptor.
+        * @since 3.0
+		* @param aDes Source descriptor
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @return void
+        */
+		void OpenDesL( const TDesC8& aDes, const RArray<TMetaDataFieldId>& aWantedFields  );
+
+        /**
+        * Returns the number of metadata.
+        * @since 3.0
+		* @return Number of metadata
+        */
+		TInt MetaDataCount() const;
+
+        /**
+        * Returns the metadata fields found in this source.
+        * Calling this function when MetaDataCount() returns 0, will result in
+        * User::Leave with KErrNotFound.
+        * @since 3.0
+        * @return Metadata field container object
+        */
+		const CMetaDataFieldContainer& MetaDataFieldsL();
+
+        /**
+        * Resets the utility. Must be called before OpenFileL or OpenDesL can be called again.
+        * @since 3.0
+		* @return void
+        */
+		void ResetL();
+
+		/**
+        * Returns the ID3 version if the file has ID3 metadata.
+        * @since 3.0
+		* @return TID3Version
+        */
+		TID3Version ID3Version();
+		/**
+        * Opens and reads metadata from the specified file.
+        * @since 3.2
+		* @param aFileName The name of the file
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @param aMimeType The MIME type of the file
+		* @return void
+        */
+		void OpenFileL( const TDesC& aFileName, const RArray<TMetaDataFieldId>& aWantedFields, const TDesC8& aMimeType );
+
+		/**
+        * Opens and reads metadata from the specified file handle
+        * @since 3.2
+		* @param aFile File handle already open
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @param aMimeType The MIME type of the file
+		* @return void
+        */
+		void OpenFileL(RFile& aFile, const RArray<TMetaDataFieldId>& aWantedFields, const TDesC8& aMimeType );
+
+        /**
+        * Reads metadata from the specified descriptor.
+        * @since 3.2
+		* @param aDes Source descriptor
+		* @param aWantedFields An array of TMetaDataFieldId's. Empty array is interpreted as all fields.
+		* @param aMimeType The MIME type of the file
+		* @return void
+        */
+		void OpenDesL( const TDesC8& aDes, const RArray<TMetaDataFieldId>& aWantedFields, const TDesC8& aMimeType );
+		
+        /**
+        * Inititalization for parsing Chunk Data.
+        * @since 5.0
+        * @param aMimeType The MIME type
+        * @param aObserver should not be NULL
+        * @return value
+        *      KErrNone
+        *      KErrInvalidArgument invalid mime type or null observer
+        */
+        TInt InitChunkData( TDesC8& aMimeType, 
+                            MMDUChunkDataObserver& aObserver );
+        
+        /** 
+        * Process the chunk data.
+        * @since 5.0
+        *      Max size of buffer passed in is N bytes for performance optimization
+        *      Buffer overflow (out of memory) results in callback with error.
+        *      invalid chunk data results in callback with error
+        *      parsing APIs are invoked before callback is received results in 0 count or empty container
+        *      parsing APIs are invoked after callback is received results in positive count and full container
+        * @param aChunk the data chunk to be processed
+        * @return value
+        *      KErrNone
+        *      KErrNotReady    Buffer is still being used
+        *      KErrArgument    Chunk size exceeds maximum
+        *      KErrCompletion  Stop sending data. Meta-data has been captured and is being parsed.
+        */
+        TInt ProcessChunkData( TDesC8& aChunk,
+                               TBool aFinalChunk = EFalse  );
+		
+        /**
+        * Parse the aggregated metadata.
+        * @since 5.0
+        * This is a request from the user to start parsing
+        * @return value
+        *      KErrNone
+        *      KErrNotReady    Buffer is still being used
+        */
+        TInt ParseChunkData();
+        
+        
+        /** 
+        * Verify whether it is in Chunk Data mode.
+        * @since 5.0
+        * @return value
+        *      ETrue
+        *      EFalse        
+        */
+        TBool IsChunkDataMode();
+        
+        /** 
+        * Close and clean up the Chunk Data mode.
+        * Need to kill the MetadataUtility since it wasn't designed to be reused.
+        * @since 5.0
+		* @return void
+        */
+        void CloseChunkData();
+		
+        /**
+        * Parses the aggregated metadata.
+        * @since 5.0
+        * This is a callback from the "Buffer Aggregator" to start parsing after all
+        * meta-data has been aggregated. 
+        * @param aChunk The aggregated metadata
+        * @param aMimeType The MIME type
+        * @return void
+        */
+        void DoParseChunkDataL(TDesC8& aChunk, TDesC8& aMimeType);
+        
+
+	private:
+
+        /**
+        * C++ default constructor.
+        */
+		CMetaDataUtilityBody();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+		void ConstructL();
+
+        /**
+        * Finds the metadata parser that can interpret the specified file.
+        * @param aFileName The name of the file
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserFileL( const TDesC& aFileName );
+
+		/**
+        * Finds the metadata parser that can interpret the specified file handle.
+        * @param aFile File Handle
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserFileL( RFile& aFile );
+
+		/**
+        * Implemetation of finding a file parser, used by FindParserFileL
+        * @param none
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* DoFindParserFileL();
+        /**
+        * Finds the metadata parser that can interpret the specified descriptor.
+        * @param aDes Source descriptor
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserDesL( const TDesC8& aDes );
+		/**
+        * Finds the metadata parser that can interpret the specified file.
+        * @param aFileName The name of the file
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserFileL( const TDesC& aFileName, const TDesC8& aMimeType );
+		/**
+        * Finds the metadata parser that can interpret the specified file handle.
+        * @since 3.2
+        * @param aFile File Handle
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserFileL( RFile& aFile, const TDesC8& aMimeType );
+		/**
+        * Implemetation of finding a file parser, used by FindParserFileL
+        * @since 3.2
+        * @param aMimeType
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* DoFindParserFileL( const TDesC8& aMimeType);
+
+        /**
+        * Finds the metadata parser that can interpret the specified descriptor.
+        * @since 3.2
+        * @param aDes Source descriptor
+        * @return Pointer to parser; NULL if unable to find one.
+		*/
+		CMetaDataParser* FindParserDesL( const TDesC8& aDes, const TDesC8& aMimeType );
+
+		/**
+        * Implemetation of
+        * @since 3.2
+        * @param aMimeType
+        * @return TInt 0(KErrNone) if supported MIME Type else KErrNotSupported(-5)
+		*/
+		TInt IsSupportedMimeType( const TDesC8& aMimeType);
+
+ 	private:	// Data
+
+		// Metadata container
+		CMetaDataFieldContainer* iContainer;
+		// Metadata parser
+		CMetaDataParser* iParser;
+		// Metadata source
+		CMetaDataSource* iSource;
+		// ID3 Version
+		TInt iID3Version;
+		// Operate in chunk data mode
+	    TBool iChunkMode;
+	    // Metadata Async
+	    CMetaDataBufferAgg* iBufferAgg;
+	    
+	};
+
+#endif      // CMETADATAUTILITYBODY_H
+
+// End of File