imagingmodules/exiflib/src/ExifCommon.cpp
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:  An internal service class including some utility functions.
*
*/


// INCLUDE FILES
#include "ExifCommon.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// TExifCommon::SetUint32
// Puts the given 32-bit unsigned integer to the 4-byte location, whose start 
// point is specified with the given 8-bit unsigned integer pointer. 
// -----------------------------------------------------------------------------
//
TInt TExifCommon::SetUint32( TUint8* aPtr, TUint32 aUint32 )
    {
    if ( !aPtr )
        {
        return KErrGeneral;
        }
    *( aPtr + 3 ) = STATIC_CAST( TUint8, ( aUint32 >> 24 ) & KOneByteMask );
    *( aPtr + 2 ) = STATIC_CAST( TUint8, ( aUint32 >> 16 ) & KOneByteMask );
    *( aPtr + 1 ) = STATIC_CAST( TUint8, ( aUint32 >> 8 ) & KOneByteMask );
    *aPtr = STATIC_CAST( TUint8, aUint32 & KOneByteMask );
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// TExifCommon::SetUint16
// Puts the given 16-bit unsigned integer to the 2-byte location, whose start 
// point is specified with the given 8-bit unsigned integer pointer. 
// -----------------------------------------------------------------------------
//
TInt TExifCommon::SetUint16( TUint8* aPtr, TUint16 aUint16 )
    {
    if ( !aPtr )
        {
        return KErrGeneral;
        }
    *( aPtr + 1 ) = STATIC_CAST( TUint8, ( aUint16 >> 8 ) & KOneByteMask );
    *aPtr = STATIC_CAST( TUint8, aUint16 & KOneByteMask );
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// TExifCommon::Uint32
// Returns a 32-bit unsigned integer from the location, whose start point is 
// specified with the given 8-bit unsigned integer pointer. 
// -----------------------------------------------------------------------------
//
TUint32 TExifCommon::Uint32L( TUint8* aPtr )
    {
    if ( !aPtr )
        {
        User::Leave( KErrGeneral );
        }
    TUint32 ret = 0;
    ret = *( aPtr + 3 );
    ret = ( ret << 8 ) + *( aPtr + 2 );
    ret = ( ret << 8 ) + *( aPtr + 1 );
    ret = ( ret << 8 ) + *aPtr;
    return ret;
    }

// -----------------------------------------------------------------------------
// TExifCommon::Int32
// Returns a 32-bit integer from the location, whose start point is specified  
// with the given 8-bit integer pointer. 
// -----------------------------------------------------------------------------
//
TInt32 TExifCommon::Int32L( TUint8* aPtr )
    {
    if ( !aPtr )
        {
        User::Leave( KErrGeneral );
        }
    TUint32 ret = 0;
    ret = *( aPtr + 3 );
    ret = ( ret << 8 ) + *( aPtr + 2 );
    ret = ( ret << 8 ) + *( aPtr + 1 );
    ret = ( ret << 8 ) + *aPtr;
    return STATIC_CAST( TInt32, ret );
    }

// -----------------------------------------------------------------------------
// TExifCommon::Uint16
// Returns a 16-bit unsigned integer from the location, whose start point is 
// specified with the given 8-bit unsigned integer pointer. 
// -----------------------------------------------------------------------------
//
TUint16 TExifCommon::Uint16L( TUint8* aPtr )
    {
    if ( !aPtr )
        {
        User::Leave( KErrGeneral );
        }
    TUint16 ret = 0;
    ret = *( aPtr + 1 );
    ret = STATIC_CAST( TUint16, ( ret << 8 ) + *aPtr );
    return ret;
    }

// -----------------------------------------------------------------------------
// TExifCommon::IsValidTagId
// Checks if the given 16-bit unsigned integer is one of the defined tag IDs.
// -----------------------------------------------------------------------------
//
TBool TExifCommon::IsValidTagId( TUint16 aTagId )
    {
    TInt i = 0;
    for ( i = 0; i < KNoIfd0Tags; ++i )
        {
        if ( aTagId == ifd0Tags[i].iId )
            {
            return ETrue;
            }
        }
    for ( i = 0; i < KNoIfdExifTags; ++i )
        {
        if ( aTagId == ifdExifTags[i].iId )
            {
            return ETrue;
            }
        }
    for ( i = 0; i < KNoIfd1Tags; ++i )
        {
        if ( aTagId == ifd1Tags[i].iId )
            {
            return ETrue;
            }
        }
    for ( i = 0; i < KNoIfdGpsTags; ++i )
        {
        if ( aTagId == ifdGpsTags[i].iId )
            {
            return ETrue;
            }
        }
    for ( i = 0; i < KNoIfdIntOpTags; ++i )
        {
        if ( aTagId == ifdIntOpTags[i].iId )
            {
            return ETrue;
            }
        }
    LOGTEXT2( _L( "ExifLib: TExifCommon::IsValidTagId() returning EFalse: aTagId=0x%x" ), aTagId );
    return EFalse;
    }

// -----------------------------------------------------------------------------
// TExifCommon::LocateJpegMarkerPtr
// Locates the pointer to the first specified Jpeg Marker from the begining
// inside the given interval.
// -----------------------------------------------------------------------------
//
TUint8* TExifCommon::LocateJpegMarkerPtr( 
    TUint16 aMarker, 
    TUint8* aStartPtr,
    TUint8* aEndPtr)
    {
    if ( ( !aStartPtr ) || ( !aEndPtr ) || ( !aMarker ) )
        {
        return NULL;
        }

    TUint16 revMarker = 
        STATIC_CAST( TUint16, ( aMarker << 8 ) + ( aMarker >> 8 ) );
    --aStartPtr;
    TUint16 atHand = 0;
    TInt error = KErrNone;
    do
        {
        if ( aStartPtr >= aEndPtr )
            {
            return NULL;
            }
        if ( *( ++aStartPtr ) == KMarkerStart )
            {
            TRAP( error, atHand = TExifCommon::Uint16L( aStartPtr ) );
            }
        } 
    while ( (atHand != revMarker ) && ( error == KErrNone) );
    if ( error )
        {
        return NULL;
        }
    return aStartPtr;
    }

// -----------------------------------------------------------------------------
// TExifCommon::LocateJpegMarkerPtrFromEnd
// Locates the pointer to the first specified Jpeg Marker from the end
// inside the given interval.
// -----------------------------------------------------------------------------
//
TUint8* TExifCommon::LocateJpegMarkerPtrFromEnd( 
    TUint16 aMarker, 
    TUint8* aStartPtr,
    TUint8* aEndPtr)
    {
    if ( ( !aStartPtr ) || ( !aEndPtr ) || ( !aMarker ) )
        {
        return NULL;
        }

    TUint16 revMarker = 
        STATIC_CAST( TUint16, ( aMarker << 8 ) + ( aMarker >> 8 ) );
    --aEndPtr;
    TUint16 atHand = 0;
    TInt error = KErrNone;
    do
        {
        if ( aEndPtr <= aStartPtr )
            {
            return NULL;
            }
        if ( *( --aEndPtr ) == KMarkerStart )
            {
            TRAP( error, atHand = TExifCommon::Uint16L( aEndPtr ) );
            }
        } 
    while ( (atHand != revMarker ) && ( error == KErrNone) );
    if ( error )
        {
        return NULL;
        }
    return aEndPtr;
    }