imagingmodules/exiflib/inc/ExifIfd.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 IFD wrapper class for handling the storage of the tags 
*                and manipulating IFDs.
*
*/


#ifndef EXIFIFD_H
#define EXIFIFD_H

//  INCLUDES
#include "ExifRead.h"
#include <e32base.h>

// FORWARD DECLARATIONS
class CExifTagImpl;

/**
*  Exif IFD wrapper base class
*  Provides the base for the other IFD structures.
*
*  @lib ExifLib
*  @since 2.6 
*/
NONSHARABLE_CLASS( CExifIfd ): public CBase
    {
    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        */
        static CExifIfd* NewBaseL( TExifIfdType aIfdType );

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

    public: // New functions

        /**
        * Checks if the IFD is in valid format, and contains all mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */        
        virtual TBool IsValid() const;

        /**
        * Checks if specified tag exists in the IFD.
        * @since 2.6 
        * @param aTagId The queried tag ID
        * @return Boolean stating if the tag exists.
        */        
        TBool TagExists( TUint16 aTagId ) const;

        /**
        * Returns the size of the IFD structure in bytes.
        * @since 2.6 
        * @return Size of the IFD in bytes.
        */   
        TUint16 Size() const;

        /**
        * Sets the next IFD offset.
        * @since 2.6 
        * @param aIfdOffset Next IFD offset
        * @return void
        */        
        void SetNextIfdOffset( TUint32 aIfdOffset );

        /**
        * Writes the tag data in the IFD structure to the location defined by 
        * the given pointer and the offset.
        * @since 2.6 
        * @param aExifDataPtr Pointer to the Exif data
        * @param aPos Offset for the beginning of the IFD data.
        * @return void
        */        
        void WriteTagsL( TUint16*& aExifDataPtr, TUint& aPos ) const;

        /**
        * Inserts/Replaces the given tag in the IFD structure.
        * @since 2.6 
        * @param aExifTag Pointer to the tag instance updated.
        * @param aCheckValidity When ETrue then tag validity is checked
        * @return void
        */        
        virtual void InsertTagL( CExifTagImpl* aExifTag, TBool aCheckValidity );

        /**
        * Removes the specified tag from the IFD structure
        * @since 2.6 
        * @param aTagId The target tag ID.
        * @return Error code.
        */        
        TInt DeleteTag( TUint16 aTagId );

        /**
        * Gets the unmodifiable specified tag instance from the IFD structure.
        * @since 2.6 
        * @param aTagId The queried tag ID.
        * @return Constant pointer to the tag instance.
        */        
        const CExifTagImpl* GetTagL( TUint16 aTagId ) const;

        /**
        * Gets the IDs and amount of the tags existing in the IFD structure.
        * @since 2.6 
        * @param aNoTags Number of tag IDs returned.
        * @return Pointer to the tag IDs.
        */        
        TUint16* GetTagIdsL( TInt& aNoTags ) const;

        /**
        * Checks if the given tag ID is one of the IDs that can be stored in 
        * the IFD structure.
        * @since 2.6 
        * @param aTagId The queried tag ID.
        * @return Boolean stating if the specified tag ID is valid for the IFD.
        */        
        TBool IsAcceptableTagId( TUint16 aTagId ) const;
        
    protected:  // New functions

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

    private:

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();

    protected:

        // The tag instances stored in the IFD.
        CArrayPtrSeg< CExifTagImpl > iTagArray;

        // Type of the IFD.
        TExifIfdType iIfdType;

        // Next IFD's offset.
        TUint32 iNextIfdOffset;

        // Size of the IFD data in bytes.
        TUint16 iSize;

    };


/**
*  Exif IFD0 wrapper class
*  
*
*  @lib ExifLib
*  @since 2.6 
*/
NONSHARABLE_CLASS( CExifIfd0 ) : public CExifIfd
    {
    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        */
        static CExifIfd0* NewL();

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

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

    public: // Functions from base classes

        /**
        * From CExifIfd Checks if the IFD is in valid format, and contains all 
        * mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */            
        TBool IsValid() const;

    private:

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();

    };


/**
*  Exif Exif-IFD wrapper class
*  
*
*  @lib ExifLib
*  @since 2.6 
*/
NONSHARABLE_CLASS( CExifIfdExif ): public CExifIfd
    {
    public:

        /**
        * Two-phased constructor.
        */
        static CExifIfdExif* NewL();

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

        /**
        * Destructor.
        */   
        virtual ~CExifIfdExif();
        
    public: // Functions from base classes

        /**
        * From CExifIfd Checks if the IFD is in valid format, and contains all 
        * mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */      
        TBool IsValid() const;        
        
    private:

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();
    };


/**
*  Exif IFD1 wrapper class
*  
*
*  @lib ExifLib
*  @since 2.6 
*/
NONSHARABLE_CLASS( CExifIfd1 ): public CExifIfd
    {
    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        */
        static CExifIfd1* NewL();

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

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

    public: // New functions

        /**
        * Inserts/Updates the given Exif thumbnail image.
        * @since 2.6 
        * @param aThumbnailData The Exif thumbnail image data that is updated
        * @return Error code.
        */    
        TInt SetThumbnailData( TDesC8* aThumbnailData );

        /**
        * Gets the Exif thumbnail image.
        * @since 2.6 
        * @param aThumbnailData The Exif thumbnail image data returned.
        * @return Error code.
        */            
        TInt GetThumbnailData( TDesC8*& aThumbnailData ) const;

        /**
        * Removes the Exif thumbnail image.
        * @since 2.6 
        * @return Error code.
        */       
        TInt RemoveThumbnailData();

        /**
        * Returns the size of the Exif thumbnail image in bytes.
        * @since 2.6 
        * @return Thumbnail image size
        */  
        TUint16 ThumbnailSize() const;

        /**
        * Writes the Exif thumbnail image to the location defined by the given 
        * pointer and the offset.
        * @since 2.6 
        * @param aExifDataPtr Pointer to the Exif data.
        * @param aPos Offset for the beginning of the thumbnail image data.
        * @return Thumbnail image size
        */  
        void WriteThumbnailL( TUint8*& aExifDataPtr, TUint& aPos ) const;

    public: // Functions from base classes

        /**
        * From CExifIfd Checks if the IFD is in valid format, and contains all 
        * mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */      
        TBool IsValid() const;

        /**
        * From CExifIfd Inserts/Replaces the given tag in the IFD structure.
        * @since 2.6 
        * @param aExifTag Pointer to the tag instance updated.
        * @param aCheckValidity When ETrue then tag validity is checked
        * @return void
        */    
        void InsertTagL( CExifTagImpl* aExifTag, TBool aCheckValidity );

    private:
        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();

    private:

        // Pointer to the descriptor containing thumbnail image data.
        TDesC8* iThumbnailBuffer;
    };


/**
*  Exif Interoperability IFD wrapper class
*  
*
*  @lib ExifLib
*  @since 2.6 
*/
NONSHARABLE_CLASS( CExifIfdIntOp ): public CExifIfd
    {
    public:

        /**
        * Two-phased constructor.
        */
        static CExifIfdIntOp* NewL();

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

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

    public: // Functions from base classes

        /**
        * From CExifIfd Checks if the IFD is in valid format, and contains all 
        * mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */      
        TBool IsValid() const;

    private:

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();
    };


/**
*  Exif Gps IFD wrapper class
*  
*
*  @lib ExifLib
*  @since 2.6 
*/

NONSHARABLE_CLASS( CExifIfdGps ): public CExifIfd
    {
    public:

        /**
        * Two-phased constructor.
        */
        static CExifIfdGps* NewL();

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

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

    public: // Functions from base classes

        /**
        * From CExifIfd Checks if the IFD is in valid format, and contains all 
        * mandatory tags.
        * @since 2.6 
        * @return Boolean stating if the IFD is valid.
        */      
        TBool IsValid() const;

    private:

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();
    };

#endif // EXIFIFD_H

// End of File