imagingmodules/exiflib/inc/ExifEndian.h
changeset 0 469c91dae73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/exiflib/inc/ExifEndian.h	Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,426 @@
+/*
+* Copyright (c) 2003, 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:  Exif data parser for both Little and Big Endian formats.
+*
+*/
+
+
+#ifndef EXIFENDIAN_H
+#define EXIFENDIAN_H
+
+//  INCLUDES
+#include <e32base.h>
+
+// CLASS DECLARATION
+
+/**
+*  Exif data parser base class.
+*  Provides the base for Little and Big endian parsers.
+*
+*  @lib ExifLib
+*  @since 2.6 
+*/
+NONSHARABLE_CLASS( CExifEndianBase ): public CBase
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CExifEndianBase* NewBaseL( 
+            const TUint8* aExifDataPtr, 
+            TUint aDataLength, 
+            TBool aIsExif );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CExifEndianBase();
+
+        /**
+        * Gets the next 8-bit unsigned integer from the data.
+        * @since 2.6 
+        * @param aUint8 The 8-bit integer returned.
+        * @return Error code.
+        */
+        TInt ReadUint8( TUint8& aUint8 );
+
+        /**
+        * Gets the next 16-bit unsigned integer from the data.
+        * @since 2.6 
+        * @param aUint16 The 16-bit integer returned.
+        * @return Error code.
+        */
+        virtual TInt ReadUInt16( TUint16& aUint16 ) = 0;
+
+        /**
+        * Gets the next 32-bit unsigned integer from the data.
+        * @since 2.6 
+        * @param aUint32 The 32-bit integer returned.
+        * @return Error code.
+        */
+        virtual TInt ReadUInt32( TUint32& aUint32 ) = 0;
+
+        /**
+        * Copies the data from the location, which starts and ends with the 
+        * given Jpeg Markers.
+        * @since 2.6 
+        * @param aStartMarker Jpeg Marker for the beginning of copying.
+        * @param aEndMarker Jpeg Marker for the end of copying.
+        * @param aDestBuffer Pointer to the target descriptor.
+        * @param aIncludeEnd States if the ending Jpeg Marker will be copied 
+        *                    or not.
+        * @return void
+        */
+        void CopyBufferL( 
+            TUint16 aStartMarker, 
+            TUint16 aEndMarker, 
+            HBufC8*& aDestBuffer, 
+            TBool aIncludeEnd = ETrue );
+
+        /**
+        * Copies the next specified amount of data to the given descriptor.
+        * @since 2.6 
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        virtual TInt CopyBuffer( 
+            TUint32 aCount, 
+            TUint8 aWordSize, 
+            HBufC8*& aBuffer ) = 0;
+
+        /**
+        * Copies the specified amount of data located in the given offset to 
+        * the given descriptor.
+        * @since 2.6 
+        * @param aOffset Offset for starting copying
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        virtual TInt CopyBuffer( 
+            TUint32 aOffset, 
+            TUint32 aCount, 
+            TUint8 aWordSize, 
+            HBufC8*& aBuffer ) = 0;
+
+        /**
+        * Moves to the specified offset.
+        * @since 2.6 
+        * @param aOffset Target offset.
+        * @return Error code.
+        */
+        TInt MoveTo( TUint aOffset );
+
+        /**
+        * Moves the current position forward by the given number of bytes.
+        * @since 2.6 
+        * @param aNoBytes Number of bytes to skip
+        * @return Error code.
+        */
+        TInt Skip( TUint aNoBytes );
+
+        /**
+        * Locates the offset of the next specified 8-bit unsigned integer 
+        * @since 2.6 
+        * @param aSearch Queried 8-bit unsigned integer
+        * @param aOffset The offset of the found location.
+        * @return Error code.
+        */
+        TInt Locate8( TUint8 aSearch, TUint32& aOffset );
+
+        /**
+        * Locates the offset of the next specified 16-bit unsigned integer 
+        * @since 2.6 
+        * @param aSearch Queried 16-bit integer
+        * @param aOffset The offset of the found location.
+        * @return Error code.
+        */
+        virtual TInt Locate16( TUint16 aSearch, TUint32& aOffset ) = 0;
+
+        /**
+        * Locates the offset of the specified Jpeg Marker, which resides 
+        * inside the given interval.
+        * @since 2.6 
+        * @param aMarker The queried Jpeg Marker
+        * @param aOffset The offset of the found location.
+        * @param aAfter Offset for starting searching.
+        * @param aBefore Offset for ending searching.
+        * @return Error code.
+        */
+        TInt LocateJpegMarker( 
+            TUint16 aMarker, 
+            TUint32& aOffset, 
+            TUint32 aAfter = 0,
+            TUint32 aBefore = 0 );
+
+        /**
+        * Locates the offset of the last specified Jpeg Marker, which resides
+        * inside the given interval
+        * @since 2.6 
+        * @param aMarker The queried Jpeg Marker
+        * @param aOffset The offset of the found location.
+        * @param aAfter Offset for starting searching.
+        * @param aBefore Offset for ending searching.
+        * @return Error code.
+        */
+        TInt LocateJpegMarkerFromEnd( 
+            TUint16 aMarker, 
+            TUint32& aOffset, 
+            TUint32 aAfter = 0,
+            TUint32 aBefore = 0 );
+
+        /**
+        * Returns the current offset position
+        * @since 3.1 
+        * @param aOffset The offset of the location.
+        * @return void.
+        */
+        void CurrentPosOffset( TUint32& aOffset );
+        
+    protected:
+
+        /**
+        * C++ default constructor.
+        */
+        CExifEndianBase();
+
+    private:
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    protected:  // Data
+
+        // The offset of the current position in the Exif data.
+        TUint32 iPosOffset;
+
+        // The offset of the Exif header (APP1 header) in the Exif data.
+        TUint32 iExifStartOffset;
+
+        // The offset for the end of Exif data.
+        TUint32 iExifEndOffset;
+
+        // The pointer to the beginning of the Exif data.
+        TUint8* iDataStartPtr;
+
+    };
+
+
+/**
+*  Exif data parser class for Little endian format.
+*
+*  @lib ExifLib
+*  @since 2.6 
+*/
+NONSHARABLE_CLASS( CExifLittleEndian ): public CExifEndianBase
+    {
+    public:  // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CExifLittleEndian* NewL( 
+            const TUint8* aDataStartPtr,
+            TUint8* aExifStartPtr, 
+            TUint8* aExifEndPtr, 
+            TBool aIsExif );
+
+        /**
+        * C++ default constructor.
+        */
+        CExifLittleEndian();
+
+        /**
+        * Destructor.
+        */        
+        virtual ~CExifLittleEndian();
+
+    public: // Functions from base classes
+
+        /**
+        * From CExifEndianBase Gets the next 16-bit unsigned integer from the 
+        * data.
+        * @since 2.6 
+        * @param aUint16 The 16-bit integer returned.
+        * @return Error code.
+        */
+        TInt ReadUInt16( TUint16& aUint16 );
+
+        /**
+        * From CExifEndianBase Gets the next 32-bit unsigned integer from the 
+        * data.
+        * @since 2.6 
+        * @param aUint32 The 32-bit integer returned.
+        * @return Error code.
+        */        
+        TInt ReadUInt32( TUint32& aUint32 );
+        
+        /**
+        * From CExifEndianBase Copies the next specified amount of data to the 
+        * given descriptor.
+        * @since 2.6 
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        TInt CopyBuffer( TUint32 aCount, TUint8 aWordSize, HBufC8*& aBuffer );
+
+        /**
+        * From CExifEndianBase Copies the specified amount of data located in 
+        * the given offset to the given descriptor.
+        * @since 2.6 
+        * @param aOffset Offset for starting copying
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        TInt CopyBuffer( 
+            TUint32 aOffset, 
+            TUint32 aCount, 
+            TUint8 aWordSize, 
+            HBufC8*& aBuffer );
+
+        /**
+        * From CExifEndianBase Locates the offset of the next specified 16-bit 
+        * unsigned integer 
+        * @since 2.6 
+        * @param aSearch Queried 16-bit integer
+        * @param aOffset The offset of the found location.
+        * @return Error code.
+        */        
+        TInt Locate16( TUint16 aSearch, TUint32& aOffset );
+
+    private:
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL( 
+            TUint8* aDataStartPtr,
+            TUint8* aExifStartPtr, 
+            TUint8* aExifEndPtr, 
+            TBool aIsExif );
+
+    };
+
+
+/**
+*  Exif data parser class for Big endian format.
+*
+*  @lib ExifLib
+*  @since 2.6 
+*/
+NONSHARABLE_CLASS( CExifBigEndian ): public CExifEndianBase
+    {
+    public:
+
+        /**
+        * Two-phased constructor.
+        */
+        static CExifBigEndian* NewL( 
+            const TUint8* aDataStartPtr, 
+            TUint8* aExifStartPtr, 
+            TUint8* aExifEndPtr, 
+            TBool aIsExif );
+
+        /**
+        * C++ default constructor.
+        */
+        CExifBigEndian();
+
+        /**
+        * Destructor.
+        */        
+        virtual ~CExifBigEndian();
+
+    public: // Functions from base classes
+
+        /**
+        * From CExifEndianBase Gets the next 16-bit unsigned integer from the 
+        * data.
+        * @since 2.6 
+        * @param aUint16 The 16-bit integer returned.
+        * @return Error code.
+        */        
+        TInt ReadUInt16( TUint16& aUint16 );
+        
+        /**
+        * From CExifEndianBase Gets the next 32-bit unsigned integer from the 
+        * data.
+        * @since 2.6 
+        * @param aUint32 The 32-bit integer returned.
+        * @return Error code.
+        */        
+        TInt ReadUInt32( TUint32& aUint32 );
+        
+        /**
+        * From CExifEndianBase Copies the next specified amount of data to the 
+        * given descriptor.
+        * @since 2.6 
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        TInt CopyBuffer( TUint32 aCount, TUint8 aWordSize, HBufC8*& aBuffer );
+
+        /**
+        * From CExifEndianBase Copies the specified amount of data located in 
+        * the given offset to the given descriptor.
+        * @since 2.6 
+        * @param aOffset Offset for starting copying
+        * @param aCount Number of words to copy
+        * @param aWordSize Word size
+        * @param aBuffer Pointer to the target descriptor.
+        * @return void
+        */
+        TInt CopyBuffer( 
+            TUint32 aOffset, 
+            TUint32 aCount, 
+            TUint8 aWordSize, 
+            HBufC8*& aBuffer );
+
+        /**
+        * From CExifEndianBase Locates the offset of the next specified 16-bit 
+        * unsigned integer 
+        * @since 2.6 
+        * @param aSearch Queried 16-bit integer
+        * @param aOffset The offset of the found location.
+        * @return Error code.
+        */        
+        TInt Locate16( TUint16 aSearch, TUint32& aOffset );
+    
+    private:
+    
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL( 
+            TUint8* aDataStartPtr, 
+            TUint8* aExifStartPtr, 
+            TUint8* aExifEndPtr, 
+            TBool aIsExif );
+    };
+
+#endif // EXIFENDIAN_H
+
+// End of File