imagingmodules/exiflib/inc/ExifEndian.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:22:31 +0200
changeset 0 469c91dae73b
permissions -rw-r--r--
Revision: 200949 Kit: 200951

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