imagingandcamerafws/imagingfws/ExifUtility/src/ExifUtility.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingandcamerafws/imagingfws/ExifUtility/src/ExifUtility.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,3695 @@
+// Copyright (c) 2004-2009 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:
+//
+
+//#include <e32base.h>
+#include <iclexif.h>
+#include  "ExifTagDescriptions.h"
+
+#include "ExifUtility.h"
+
+/**
+Constructor
+
+Instantiates the exif reader utility.
+Note: no method on this utility should be used after the metadate has been destroyed
+
+@param aExifMetadata
+	the metadata class on which to read the tags
+*/
+EXPORT_C TExifReaderUtility::TExifReaderUtility(MExifMetadataReader* aExifMetadata)
+	: iExifRead(aExifMetadata)
+	{
+	}
+	
+
+// Getters
+/**
+Gets the make tag value of the metadata. 
+
+@param aParam
+	on return, the make value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetMake(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag010F[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the model tag value of the metadata. 
+
+@param aParam
+	on return, the model value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetModel(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0110[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the dateTime tag value of the metadata. 
+
+@param aParam
+	on return, the dateTime value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetDateTime(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0132[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the dateTimeOriginal tag value of the metadata. 
+
+@param aParam
+	on return, the dateTimeOriginal value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetDateTimeOriginal(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9003[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the dateTimeDigitized tag value of the metadata. 
+
+@param aParam
+	on return, the dateTimeDigitized value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetDateTimeDigitized(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9004[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the interoperabilityIndex tag value of the metadata. 
+
+@param aParam
+	on return, the interoperabilityIndex value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetInteroperabilityIndex(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0001[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the interoperabilityVersion tag value of the metadata. 
+
+@param aParam
+	on return, the interoperabilityVersion value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetInteroperabilityVersion(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0002[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the exifVersion tag value of the metadata. 
+
+@param aParam
+	on return, the exifVersion value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetExifVersion(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9000[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the componentsConfiguration tag value of the metadata. 
+
+@param aParam
+	on return, the ComponentConfiguration value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetComponentsConfiguration(HBufC8*& aParam) const
+	{	
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9101[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the flashpixVersion tag value of the metadata. 
+
+@param aParam
+	on return, the flashpixVersion value
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetFlashPixVersion(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA000[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the main image xResolution tag value of the metadata. 
+
+@param aNumerator
+	on return, the main image xResolution numerator value
+	
+@param aDenominator
+	on return, the main image xResolution denominator value
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetXResolution(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag011A[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+	
+/**
+Gets the main image yResolution tag value of the metadata. 
+
+@param aNumerator
+	on return, the main image yResolution numerator value
+	
+@param aDenominator
+	on return, the main image yResolution denominator value
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetYResolution(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag011B[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+	
+/**
+Gets the thumbnail xResolution tag value of the metadata. 
+
+@param aNumerator
+	on return, the main thumbnail xResolution numerator value
+
+@param aDenominator
+	on return, the main thumbnail xResolution denominator value
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetThumbXResolution(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag011A[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+	
+/**
+Gets the thumbnail yResolution tag value of the metadata. 
+
+@param aNumerator
+	on return, the main thumbnail yResolution numerator value
+
+@param aDenominator
+	on return, the main thumbnail yResolution denominator value
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetThumbYResolution(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag011B[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the main image resolutionUnit tag value of the metadata. 
+
+@param aParam
+	on return, the main image resolutionUnit value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetResolutionUnit(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0128[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+	
+/**
+Gets the yCbCrPositioning tag value of the metadata. 
+
+@param aParam
+	on return, the yCbCrPositioning value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetYCbCrPositioning(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0213[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+	
+/**
+Gets the main image orientation tag value of the metadata. 
+
+@param aParam
+	on return, the main image orientation value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/EXPORT_C TInt TExifReaderUtility::GetOrientation(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0112[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+	
+/**
+Gets the colorSpace tag value of the metadata. 
+
+@param aParam
+	on return, the colorSpace value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetColorSpace(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA001[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+	
+/**
+Gets the pixelXDimension tag value of the metadata. 
+
+@param aParam
+	on return, the pixelXDimension value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetPixelXDimension(TInt& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA002[ETagValue];
+	TInt ifd = KExifIfdZero;
+
+	//This tag can be SHORT or LONG so first try to read as integer if
+	//that does not work then try as SHORT
+	TInt err = iExifRead->GetIntegerParam(tag, ifd, aParam);
+	
+	if (err == KErrArgument)
+		{
+		//then the tag could be short
+		TUint16 paramShort = 0;
+		err = iExifRead->GetShortParam(tag, ifd, paramShort);
+		if (err == KErrNone)
+			{
+			//tag was SHORT so set aParam
+			aParam = static_cast<TInt>(paramShort);
+			}
+		else
+			{
+			err = KErrArgument; //just to ensure behaviour is unaltered from 9.x
+			}
+		}
+	return err;
+	}
+	
+/**
+Gets the pixelYDimension tag value of the metadata. 
+
+@param aParam
+	on return, the pixelYDimension value
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetPixelYDimension(TInt& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA003[ETagValue];
+	TInt ifd = KExifIfdZero;
+
+	//This tag can be SHORT or LONG so first try to read as integer if
+	//that does not work then try as SHORT
+	TInt err = iExifRead->GetIntegerParam(tag, ifd, aParam);
+	
+	if (err == KErrArgument)
+		{
+		//then the tag could be short
+		TUint16 paramShort = 0;
+		err = iExifRead->GetShortParam(tag, ifd, paramShort);
+		if (err == KErrNone)
+			{
+			//tag was SHORT so set aParam
+			aParam = static_cast<TInt>(paramShort);
+			}
+		else
+			{
+			err = KErrArgument; //just to ensure behaviour is unaltered from 9.x
+			}
+		}
+	return err;
+	}
+
+/**
+Gets the thumbnail compression tag value of the metadata. 
+
+@param aParam
+	on return, the thumbnail compression value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetThumbCompression(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0103[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+	
+/**
+Gets the thumbnail resolutionUnit tag value of the metadata. 
+
+@param aParam
+	on return, the thumbnail resolutionUnit value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetThumbResolutionUnit(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0128[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+
+/**
+Gets the thumbnail orientation tag value of the metadata. 
+
+@param aParam
+	on return, the thumbnail orientation value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifReaderUtility::GetThumbOrientation(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0112[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+
+/**
+Gets the image description tag value of the metadata. 
+
+@param aParam
+	on return, the image description value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetImageDescription(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag010E[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the copyright tag value of the metadata. 
+
+@param aParam
+	on return, the copyright value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetCopyright(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag8298[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the maker note tag value of the metadata. 
+
+@param aParam
+	on return, the maker note value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetMakerNote(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag927C[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the user comment tag value of the metadata. 
+
+@param aParam
+	on return, the user comment value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+	Note: The first 8 bytes of aParam may contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetUserComment(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9286[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+	
+/**
+Gets the flash tag value of the metadata. 
+
+@param aParam
+	on return, the flash value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetFlash(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9209[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+
+/**
+Gets the focal length tag value of the metadata. 
+
+@param aNumerator
+	on return, the focal length numerator value.
+		
+@param aDenominator
+	on return, the focal length denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetFocalLength(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag920A[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+	
+/**
+Gets the shutter speed tag value of the metadata. 
+
+@param aNumerator
+	on return, the shutter speed numerator value.
+	
+	Note that aNumerator is a true signed quantity, so no typecasting to an unsigned type is required.
+
+@param aDenominator
+	on return, the shutter speed denominator value.
+
+	Note that aDenominator is a true signed quantity, so no typecasting to an unsigned type is required.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetShutterSpeedValue(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9201[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the thumbnail jpeg interchange format length of the metadata. 
+
+@deprecated - Replaced by TExifReaderUtility::GetJpegInterchangeFormatLength(TUint& aParam).
+
+@param aParam
+	on return, the thumbnail jpeg interchange format length.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetJpegInterchangeFormatLength(TInt& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0202[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifRead->GetIntegerParam(tag, ifd, aParam);
+	}
+
+/**
+Gets the thumbnail jpeg interchange format length of the metadata. 
+
+@param aParam
+	on return, the thumbnail jpeg interchange format length.
+		
+@return error code
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetJpegInterchangeFormatLength(TUint& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0202[ETagValue];
+	TInt ifd = KExifIfdOne;
+	TInt value = 0;
+	TInt result = iExifRead->GetIntegerParam(tag, ifd, value);
+	if (result == KErrNone)
+		{
+		aParam = static_cast<TUint>(value);
+		}
+	return result;
+	}
+	
+/**
+Gets the gps version id tag value of the metadata. 
+
+@param aParam
+	on return, the gps version id.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsVersionId(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0000[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps north or south latitude tag value of the metadata. 
+
+@param aParam
+	on return, the gps north or south latitude.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsLatitudeRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0001[ETagValue];
+	 
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps latitude tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees latitude numerator value.
+		
+@param aDegDenominator
+	on return, the degrees latitude denominator value.
+		
+@param aMinNumerator
+	on return, the minutes latitude numerator value.
+		
+@param aMinDenominator
+	on return, the minutes latitude denominator value.
+		
+@param aSecNumerator
+	on return, the seconds latitude numerator value.
+		
+@param aSecDenominator
+	on return, the seconds latitude denominator value.
+			
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+	KErrCorrupt if the gps latitude tag value of the metadata is corrupt. 
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsLatitude(TInt& aDegNumerator, TInt& aDegDenominator, TInt& aMinNumerator, TInt& aMinDenominator, TInt& aSecNumerator, TInt& aSecDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0002[ETagValue];
+	TInt count = KTagGPS0002[EComponentCountValue];
+	
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TInt result = iExifRead->GetRationalArrayParam(tag, ifd, *param);
+	if (result==KErrNone)
+		{
+		if(param->Count()!=count)
+			{
+			result=KErrCorrupt;
+			}
+		else
+			{
+			aDegNumerator = param->At(0).iNumerator;
+			aDegDenominator = param->At(0).iDenominator;
+			aMinNumerator = param->At(1).iNumerator;
+			aMinDenominator = param->At(1).iDenominator;
+			aSecNumerator = param->At(2).iNumerator;
+			aSecDenominator = param->At(2).iDenominator;
+			}
+		}		
+
+	delete param;
+	return result;
+	}
+
+/**
+Gets the gps east or west longitude tag value of the metadata. 
+
+@param aParam
+	on return, the gps east or west longitude.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsLongitudeRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0003[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps longitude tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees longitude numerator value.
+		
+@param aDegDenominator
+	on return, the degrees longitude denominator value.
+	
+@param aMinNumerator
+	on return, the minutes longitude numerator value.
+	
+@param aMinDenominator
+	on return, the minutes longitude denominator value.
+	
+@param aSecNumerator
+	on return, the seconds longitude numerator value.
+
+@param aSecDenominator
+	on return, the seconds longitude denominator value.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+	KErrCorrupt if the gps longitude tag value of the metadata is corrupt. 
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsLongitude(TInt& aDegNumerator, TInt& aDegDenominator, TInt& aMinNumerator, TInt& aMinDenominator, TInt& aSecNumerator, TInt& aSecDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0004[ETagValue];
+	TInt count = KTagGPS0004[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TInt result = iExifRead->GetRationalArrayParam(tag, ifd, *param);
+	if (result==KErrNone)
+		{
+		if(param->Count()!=count)
+			{
+			result=KErrCorrupt;
+			}
+		else
+			{
+			aDegNumerator = param->At(0).iNumerator;
+			aDegDenominator = param->At(0).iDenominator;
+			aMinNumerator = param->At(1).iNumerator;
+			aMinDenominator = param->At(1).iDenominator;
+			aSecNumerator = param->At(2).iNumerator;
+			aSecDenominator = param->At(2).iDenominator;
+			}
+		}		
+
+	delete param;
+	return result;
+	}
+
+/**
+Gets the gps altitude reference tag value of the metadata. 
+
+@param aParam
+	on return, the gps altitude reference.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsAltitudeRef(TUint8& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0005[ETagValue];
+	TInt count = KTagGPS0005[EComponentCountValue];
+	
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	HBufC8* data = NULL;
+	TRAPD(err, data=HBufC8::NewL(count));
+	if (err!=KErrNone)
+		{
+		return KErrNoMemory;
+		}
+	TInt result = iExifRead->GetParam8(tag, ifd, data);
+	if (result==KErrNone)
+		{
+		aParam = static_cast<TUint8>((*data)[0]);
+		}
+	delete data;
+	return result;
+	}
+	
+/**
+Gets the gps altitude tag value of the metadata. 
+
+@param aNumerator
+	on return, the gps altitude numerator value.
+		
+@param aDenominator
+	on return, the gps altitude denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsAltitude(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0006[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps time tag value of the metadata. 
+
+@param aHourNumerator
+	on return, the gps hour numerator value.
+		
+@param aHourDenominator
+	on return, the gps hour denominator value.
+	
+@param aMinNumerator
+	on return, the gps minutes numerator value.
+	
+@param aMinDenominator
+	on return, the gps minutes denominator value.
+	
+@param aSecNumerator
+	on return, the gps seconds numerator value.
+	
+@param aSecDenominator
+	on return, the gps seconds denominator value.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+	KErrCorrupt if the gps longitude tag value of the metadata is corrupt. 
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsTimeStamp(TInt& aHourNumerator, TInt& aHourDenominator, TInt& aMinNumerator, TInt& aMinDenominator, TInt& aSecNumerator, TInt& aSecDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0007[ETagValue];
+	TInt count = KTagGPS0007[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TInt result = iExifRead->GetRationalArrayParam(tag, ifd, *param);
+	if (result==KErrNone)
+		{
+		if(param->Count()!=count)
+			{
+			result=KErrCorrupt;
+			}
+		else
+			{
+			aHourNumerator = param->At(0).iNumerator;
+			aHourDenominator = param->At(0).iDenominator;
+			aMinNumerator = param->At(1).iNumerator;
+			aMinDenominator = param->At(1).iDenominator;
+			aSecNumerator = param->At(2).iNumerator;
+			aSecDenominator = param->At(2).iDenominator;
+			}
+		}		
+
+	delete param;
+	return result;
+	}
+
+/**
+Gets the gps satellites used for measurement tag value of the metadata. 
+
+@param aParam
+	on return, the gps satellites used for measurement value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsSatellites(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0008[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps receiver status tag value of the metadata. 
+
+@param aParam
+	on return, the gps receiver status value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsStatus(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0009[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps measurement mode tag value of the metadata. 
+
+@param aParam
+	on return, the gps measurement mode value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsMeasureMode(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000A[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps measurement precision tag value of the metadata. 
+
+@param aNumerator
+	on return, the gps measurement precision numerator value.
+		
+@param aDenominator
+	on return, the gps measurement precision denominator value.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDop(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000B[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps speed unit tag value of the metadata. 
+
+@param aParam
+	on return, the gps speed unit value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsSpeedRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000C[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the speed of gps receiver tag value of the metadata. 
+
+@param aNumerator
+	on return, the speed of gps receiver numerator value.
+		
+@param aDenominator
+	on return, the speed of gps receiver denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsSpeed(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000D[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps reference for direction of movement tag value of the metadata. 
+
+@param aParam
+	on return, the gps reference for direction of movement value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsTrackRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000E[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps direction of movement tag value of the metadata. 
+
+@param aNumerator
+	on return, the gps direction of movement numerator value.
+		
+@param aDenominator
+	on return, the gps direction of movement denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsTrack(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000F[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps reference for direction of image tag value of the metadata. 
+
+@param aParam
+	on return, the gps reference for direction of image value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsImgDirectionRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0010[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps direction of image tag value of the metadata. 
+
+@param aNumerator
+	on return, the gps direction of image numerator value.
+		
+@param aDenominator
+	on return, the gps direction of image denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsImgDirection(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0011[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps geodetic survey data used tag value of the metadata. 
+
+@param aParam
+	on return, the geodetic survey data used value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsMapDatum(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0012[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps reference for latitude of destination tag value of the metadata. 
+
+@param aParam
+	on return, the reference for latitude of destination value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestLatitudeRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0013[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps latitude of destination tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees latitude of destination numerator value.
+		
+@param aDegDenominator
+	on return, the degrees latitude of destination denominator value.
+	
+@param aMinNumerator
+	on return, the minutes latitude of destination numerator value.
+	
+@param aMinDenominator
+	on return, the minutes latitude of destination denominator value.
+	
+@param aSecNumerator
+	on return, the seconds latitude of destination numerator value.
+	
+@param aSecDenominator
+	on return, the seconds latitude of destination denominator value.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestLatitude(TInt& aDegNumerator, TInt& aDegDenominator, TInt& aMinNumerator, TInt& aMinDenominator, TInt& aSecNumerator, TInt& aSecDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0014[ETagValue];
+	TInt count = KTagGPS0014[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TInt result = iExifRead->GetRationalArrayParam(tag, ifd, *param);
+	if (result==KErrNone)
+		{
+		if(param->Count()!=count)
+			{
+			result=KErrCorrupt;
+			}
+		else
+			{
+			aDegNumerator = param->At(0).iNumerator;
+			aDegDenominator = param->At(0).iDenominator;
+			aMinNumerator = param->At(1).iNumerator;
+			aMinDenominator = param->At(1).iDenominator;
+			aSecNumerator = param->At(2).iNumerator;
+			aSecDenominator = param->At(2).iDenominator;
+			}
+		}		
+
+	delete param;
+	return result;
+	}
+
+/**
+Gets the gps reference for longitude of destination tag value of the metadata. 
+
+@param aParam
+	on return, the gps reference for longitude of destination value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestLongitudeRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0015[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps longitude of destination tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees longitude of destination numerator value.
+		
+@param aDegDenominator
+	on return, the degrees longitude of destination denominator value.
+	
+@param aMinNumerator
+	on return, the minutes longitude of destination numerator value.
+	
+@param aMinDenominator
+	on return, the minutes longitude of destination denominator value.
+	
+@param aSecNumerator
+	on return, the seconds longitude of destination numerator value.
+	
+@param aSecDenominator
+	on return, the seconds longitude of destination denominator value.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestLongitude(TInt& aDegNumerator, TInt& aDegDenominator, TInt& aMinNumerator, TInt& aMinDenominator, TInt& aSecNumerator, TInt& aSecDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0016[ETagValue];
+	TInt count = KTagGPS0016[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	TInt result = iExifRead->GetRationalArrayParam(tag, ifd, *param);
+	if (result==KErrNone)
+		{
+		if(param->Count()!=count)
+			{
+			result=KErrCorrupt;
+			}
+		else
+			{
+			aDegNumerator = param->At(0).iNumerator;
+			aDegDenominator = param->At(0).iDenominator;
+			aMinNumerator = param->At(1).iNumerator;
+			aMinDenominator = param->At(1).iDenominator;
+			aSecNumerator = param->At(2).iNumerator;
+			aSecDenominator = param->At(2).iDenominator;
+			}
+		}		
+
+	delete param;
+	return result;
+	}
+
+/**
+Gets the gps reference for bearing of destination tag value of the metadata. 
+
+@param aParam
+	on return, the reference for bearing of destination value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestBearingRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0017[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps bearing of destination tag value of the metadata. 
+
+@param aNumerator
+	on return, the bearing of destination numerator value.
+		
+@param aDenominator
+	on return, the bearing of destination denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestBearing(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0018[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the gps reference for distance to destination tag value of the metadata. 
+
+@param aParam
+	on return, the reference for distance to destination value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestDistanceRef(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0019[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps distance to destination tag value of the metadata. 
+
+@param aNumerator
+	on return, the distance to destination numerator value.
+		
+@param aDenominator
+	on return, the distance to destination denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDestDistance(TInt& aNumerator, TInt& aDenominator) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001A[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Gets the name of gps processing method tag value of the metadata. 
+
+@param aParam
+	on return, the name of gps processing method value.
+
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+	Note: According to the Exif 2.2 specification, the first 8 bytes of aParam should contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+			
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsProcessingMethod(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001B[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the name of gps area tag value of the metadata. 
+
+@param aParam
+	on return, the name of gps area value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+
+	Note: According to the Exif 2.2 specification, the first 8 bytes of aParam should contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+		
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsAreaInformation(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001C[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps date tag value of the metadata. 
+
+@param aParam
+	on return, the gps date value.
+	
+	Ownership of the buffer pointed to by aParam transfers to the client, which is therefore responsible for deleting the buffer when required. 
+	Note: The client should always initialise aParam to NULL, and the plugin should only assign to this parameter when ready to transfer ownership.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDateStamp(HBufC8*& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001D[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetParam8(tag, ifd, aParam);
+	}
+
+/**
+Gets the gps differential correction tag value of the metadata. 
+
+@param aParam
+	on return, the gps differential correction value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifReaderUtility::GetGpsDifferential(TUint16& aParam) const
+	{
+	if(iExifRead==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001E[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifRead->GetShortParam(tag, ifd, aParam);
+	}
+
+// Setters
+
+/**
+Constructor
+
+instantiates the exif writer utility.
+Note: no method on this utility should be used after the metadate has been destroyed
+
+@param aExifMetadata
+	the metadata class on which to read the tags
+*/
+EXPORT_C TExifWriterUtility::TExifWriterUtility(MExifMetadataWriter* aExifMetadata):
+			iExifWrite(aExifMetadata)
+	{
+	}
+
+/**
+Sets the make tag value of the metadata. 
+
+@param aMake
+	the make value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetMake(HBufC8* aMake)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag010F[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aMake);
+	}
+	
+/**
+Sets the model tag value of the metadata. 
+
+@param aModel
+	the model value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetModel(HBufC8* aModel)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0110[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aModel);
+	}
+	
+/**
+Sets the dateTime tag value of the metadata. 
+
+@param aDateTime
+	the dateTime value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetDateTime(HBufC8* aDateTime)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0132[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aDateTime);
+	}
+
+/**
+Sets the dateTimeOriginal tag value of the metadata. 
+
+@param aDateTime
+	the dateTimeOriginal value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetDateTimeOriginal(HBufC8* aDateTime)	
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9003[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aDateTime);
+	}
+	
+/**
+Sets the dateTimeDigitized tag value of the metadata. 
+
+@param aDateTime
+	the dateTimeDigitized value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetDateTimeDigitized(HBufC8* aDateTime)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9004[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aDateTime);
+	}
+	
+/**
+Sets the interoperabilityindex tag value of the metadata. 
+
+@param aIdx
+	the interoperabilityIndex value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetInteroperabilityIndex(HBufC8* aIdx)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0001[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aIdx);
+	}
+
+/**
+Sets the interoperabilityVersion tag value of the metadata. 
+
+@param aIdx
+	the interoperabilityVersion value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetInteroperabilityVersion(HBufC8* aIdx)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0002[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aIdx);
+	}
+
+/**
+Sets the exifVersion tag value of the metadata. 
+
+@param aExifVersion
+	the exifVersion value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetExifVersion(HBufC8* aExifVersion)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9000[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aExifVersion);
+	}
+
+/**
+Sets the componentsConfiguration tag value of the metadata. 
+
+@param aComponentsConfig
+	the componentsConfiguration value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetComponentsConfiguration(HBufC8* aComponentsConfig)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9101[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aComponentsConfig);
+	}
+
+/**
+Sets the flashpixVersion tag value of the metadata. 
+
+@param aFlashPixVer
+	the flashpixVersion value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetFlashPixVersion(HBufC8* aFlashPixVer)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA000[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aFlashPixVer);
+	}
+
+/**
+Sets the main image xResolution tag value of the metadata. 
+
+@param aNumerator
+	the main image xResolution value numerator
+@param aDenominator
+	the main image xResolution value denominator
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetXResolution(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag011A[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the main image yResolution tag value of the metadata. 
+
+@param aNumerator
+	the main image yResolution value numerator
+@param aDenominator
+	the main image yResolution value denominator
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetYResolution(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag011B[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the thumbnail xResolution tag value of the metadata. 
+
+@param aNumerator
+	the thumbnail xResolution value numerator
+@param aDenominator
+	the thumbnail xResolution value denominator
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetThumbXResolution(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag011A[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the thumbnail yResolution tag value of the metadata. 
+
+@param aNumerator
+	the thumbnail yResolution value numerator
+@param aDenominator
+	the thumbnail yResolution value denominator
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetThumbYResolution(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag011B[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the main image resolutionUnit tag value of the metadata. 
+
+@param aResUnit
+	the main image resolutionUnit value
+	
+	Note: aResUnit may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetResolutionUnit(TInt aResUnit)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0128[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetShortParam(tag, ifd, aResUnit);
+	}
+
+/**
+Sets the yCbCrPositioning tag value of the metadata. 
+
+@param aPositioning
+	the yCbCrPositioning value
+	
+	Note: aPositioning may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetYCbCrPositioning(TInt aPositioning)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0213[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetShortParam(tag, ifd, aPositioning);
+	}
+
+/**
+Sets the main image orientation tag value of the metadata. 
+
+@param aOrientation
+	the main image orientation value
+	
+	Note: aOrientation may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetOrientation(TInt aOrientation)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag0112[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetShortParam(tag, ifd, aOrientation);
+	}
+
+/**
+Sets the colorSpace tag value of the metadata. 
+
+@param aColorSpace
+	the colorSpace value
+	
+	Note: aColorSpace may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetColorSpace(TInt aColorSpace)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA001[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetShortParam(tag, ifd, aColorSpace);
+	}
+
+/**
+Sets the pixelXDimension tag value of the metadata. 
+
+@param aPixelXDim
+	the pixelXDimension value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetPixelXDimension(TInt aPixelXDim)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA002[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetIntegerParam(tag, ifd, aPixelXDim);
+	}
+
+/**
+Sets the pixelYDimension tag value of the metadata. 
+
+@param aPixelYDim
+	the pixelYDimension value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetPixelYDimension(TInt aPixelYDim)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagA003[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetIntegerParam(tag, ifd, aPixelYDim);
+	}
+
+/**
+Sets the thumbnail compression tag value of the metadata. 
+
+@param aCompression
+	the thumbnail compression value
+	
+	Note: aCompression may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetThumbCompression(TInt aCompression)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0103[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifWrite->SetShortParam(tag, ifd, aCompression);
+	}
+
+/**
+Sets the thumbnail resolutionUnit tag value of the metadata. 
+
+@param aResUnit
+	the thumbnail resolutionUnit value
+	
+	Note: aResUnit may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetThumbResolutionUnit(TInt aResUnit)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0128[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifWrite->SetShortParam(tag, ifd, aResUnit);
+	}
+
+/**
+Sets the thumbnail orientation tag value of the metadata. 
+
+@param aOrientation
+	the thumbnail orientation value
+	
+	Note: aOrientation may only take unsigned short (16-bit) values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+*/
+EXPORT_C TInt TExifWriterUtility::SetThumbOrientation(TInt aOrientation)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KThumbTag0112[ETagValue];
+	TInt ifd = KExifIfdOne;
+	return iExifWrite->SetShortParam(tag, ifd, aOrientation);
+	}
+
+/**
+Sets the image description tag value of the metadata. 
+
+@param aImageDescription
+	the image description value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetImageDescription(HBufC8* aImageDescription)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag010E[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aImageDescription);
+	}
+
+/**
+Sets the copyright tag value of the metadata. 
+
+@param aCopyright
+	the copyright value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetCopyright(HBufC8* aCopyright)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag8298[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aCopyright);
+	}
+
+/**
+Sets the maker note tag value of the metadata. 
+
+@param aMakerNote
+	the maker note value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetMakerNote(HBufC8* aMakerNote)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag927C[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aMakerNote);
+	}
+
+/**
+Sets the user comment tag value of the metadata. 
+
+@param aUserComment
+	the user comment value.
+
+	Note: According to the Exif 2.2 specification, the first 8 bytes of aUserComment must contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetUserComment(HBufC8* aUserComment)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9286[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetParam8(tag, ifd, aUserComment);
+	}
+
+/**
+Sets the flash tag value of the metadata. 
+
+@param aFlash
+	the flash value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetFlash(TUint16 aFlash)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9209[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetShortParam(tag, ifd, aFlash);
+	}
+
+/**
+Sets the focal length tag value of the metadata. 
+
+@param aNumerator
+	the focal length numerator value
+@param aDenominator
+	the focal length denominator value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetFocalLength(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag920A[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the shutter speed tag value of the metadata. 
+
+@param aNumerator
+	the shutter speed numerator value.
+	
+	Note that aNumerator may take signed values.
+
+@param aDenominator
+	the shutter speed denominator value.
+	
+	Note that aDenominator may take signed values.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetShutterSpeedValue(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTag9201[ETagValue];
+	TInt ifd = KExifIfdZero;
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps version id tag value of the metadata. 
+
+@param aGpsVersionId
+	the gps version id value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsVersionId(HBufC8* aGpsVersionId)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0000[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+		
+	return iExifWrite->SetParam8(tag, ifd, aGpsVersionId);
+	}
+
+/**
+Sets the gps north or south latitude tag value of the metadata. 
+
+@param aGpsLatitudeRef
+	the gps north or south latitude value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsLatitudeRef(HBufC8* aGpsLatitudeRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0001[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsLatitudeRef);
+	}
+
+
+/**
+Sets the gps latitude tag value of the metadata. 
+
+@param aDegNumerator
+	the degrees latitude numerator value.
+@param aDegDenominator
+	the degrees latitude denominator value.
+@param aMinNumerator
+	the minutes latitude numerator value.
+@param aMinDenominator
+	the minutes latitude denominator value.
+@param aSecNumerator
+	the seconds latitude numerator value.
+@param aSecDenominator
+	the seconds latitude denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsLatitude(TInt aDegNumerator, TInt aDegDenominator, TInt aMinNumerator, TInt aMinDenominator, TInt aSecNumerator, TInt aSecDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0002[ETagValue];
+	TInt count = KTagGPS0002[EComponentCountValue];
+	
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	const TRational degs={aDegNumerator, aDegDenominator};
+	const TRational mins={aMinNumerator, aMinDenominator};
+	const TRational secs={aSecNumerator, aSecDenominator};
+	
+	TRAPD(insertErr,
+		param->InsertL(0, degs);
+		param->InsertL(1, mins);
+		param->InsertL(2, secs); );
+	if (insertErr!=KErrNone)
+		{
+		delete param;
+		return insertErr;
+		}
+		
+	TInt result = iExifWrite->SetRationalArrayParam(tag, ifd, *param);		
+
+	delete param;
+	return result;		
+	}	
+
+/**
+Sets the east or west longitude tag value of the metadata. 
+
+@param aGpsLongitudeRef
+	the east or west longitude value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsLongitudeRef(HBufC8* aGpsLongitudeRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0003[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsLongitudeRef);
+	}
+
+/**
+Sets the gps longitude tag value of the metadata. 
+
+@param aDegNumerator
+	the degrees longitude numerator value.
+@param aDegDenominator
+	the degrees longitude denominator value.
+@param aMinNumerator
+	the minutes longitude numerator value.
+@param aMinDenominator
+	the minutes longitude denominator value.
+@param aSecNumerator
+	the seconds longitude numerator value.
+@param aSecDenominator
+	the seconds longitude denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsLongitude(TInt aDegNumerator, TInt aDegDenominator, TInt aMinNumerator, TInt aMinDenominator, TInt aSecNumerator, TInt aSecDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0004[ETagValue];
+	TInt count = KTagGPS0004[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	const TRational degs={aDegNumerator, aDegDenominator};
+	const TRational mins={aMinNumerator, aMinDenominator};
+	const TRational secs={aSecNumerator, aSecDenominator};
+	
+	TRAPD(insertErr,
+		param->InsertL(0, degs);
+		param->InsertL(1, mins);
+		param->InsertL(2, secs); );
+	if (insertErr!=KErrNone)
+		{
+		delete param;
+		return insertErr;
+		}
+		
+	TInt result = iExifWrite->SetRationalArrayParam(tag, ifd, *param);		
+
+	delete param;
+	return result;	
+	}
+
+/**
+Sets the gps altitude reference tag value of the metadata. 
+
+@param aGpsAltitudeRef
+	the altitude reference value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+	KErrNoMemory if there was not enough memory available to complete the request.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsAltitudeRef(TUint8 aGpsAltitudeRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0005[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	HBufC8* data = NULL;
+	TRAPD(err, data=HBufC8::NewL(1));
+	if (err!=KErrNone)
+		{
+		return KErrNoMemory;
+		}
+
+	TPtr8 bufPtr(data->Des());
+	bufPtr.Append(aGpsAltitudeRef);
+	
+	TInt result = iExifWrite->SetParam8(tag, ifd, data);
+	delete data;
+	return result;
+	}
+
+/**
+Sets the gps altitude tag value of the metadata. 
+
+@param aNumerator
+	the altitude numerator value.
+@param aDenominator
+	the altitude denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsAltitude(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0006[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps time tag value of the metadata. 
+
+@param aHourNumerator
+	the hour numerator value.
+@param aHourDenominator
+	the hour denominator value.
+@param aMinNumerator
+	the minutes numerator value.
+@param aMinDenominator
+	the minutes denominator value.
+@param aSecNumerator
+	the seconds numerator value.
+@param aSecDenominator
+	the seconds denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsTimeStamp(TInt aHourNumerator, TInt aHourDenominator, TInt aMinNumerator, TInt aMinDenominator, TInt aSecNumerator, TInt aSecDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0007[ETagValue];
+	TInt count = KTagGPS0007[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	const TRational hours={aHourNumerator, aHourDenominator};
+	const TRational mins={aMinNumerator, aMinDenominator};
+	const TRational secs={aSecNumerator, aSecDenominator};
+	
+	TRAPD(insertErr,
+		param->InsertL(0, hours);
+		param->InsertL(1, mins);
+		param->InsertL(2, secs); );
+	if (insertErr!=KErrNone)
+		{
+		delete param;
+		return insertErr;
+		}
+		
+	TInt result = iExifWrite->SetRationalArrayParam(tag, ifd, *param);		
+
+	delete param;
+	return result;		
+	}
+
+/**
+Sets the gps satellites used for measurement tag value of the metadata. 
+
+@param aGpsSatellites
+	the gps satellites used for measurement value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsSatellites(HBufC8* aGpsSatellites)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0008[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsSatellites);
+	}
+
+/**
+Sets the gps receiver status tag value of the metadata. 
+
+@param aGpsStatus
+	the gps receiver status value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsStatus(HBufC8* aGpsStatus)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0009[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsStatus);
+	}
+
+/**
+Sets the gps measurement mode tag value of the metadata. 
+
+@param aGpsMeasureMode
+	the gps measurement mode value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsMeasureMode(HBufC8* aGpsMeasureMode)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000A[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsMeasureMode);
+	}
+
+/**
+Sets the gps measurement precision tag value of the metadata. 
+
+@param aNumerator
+	the measurement precision numerator value.
+@param aDenominator
+	the measurement precision denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDop(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000B[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps speed unit tag value of the metadata. 
+
+@param aGpsSpeedRef
+	the speed unit value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsSpeedRef(HBufC8* aGpsSpeedRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000C[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsSpeedRef);
+	}
+
+/**
+Sets the speed of gps receiver tag value of the metadata. 
+
+@param aNumerator
+	the speed of gps receiver numerator value.
+@param aDenominator
+	the speed of gps receiver denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsSpeed(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000D[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps reference for direction of movement tag value of the metadata. 
+
+@param aGpsTrackRef
+	the gps reference for direction of movement value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsTrackRef(HBufC8* aGpsTrackRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000E[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsTrackRef);
+	}
+
+/**
+Sets the direction of movement tag value of the metadata. 
+
+@param aNumerator
+	the direction of movement numerator value.
+@param aDenominator
+	the direction of movement denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsTrack(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS000F[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps reference for direction of image tag value of the metadata. 
+
+@param aGpsImgDirectionRef
+	the gps reference for direction of image value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsImgDirectionRef(HBufC8* aGpsImgDirectionRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0010[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsImgDirectionRef);
+	}
+
+/**
+Sets the direction of image tag value of the metadata. 
+
+@param aNumerator
+	the direction of image numerator value.
+@param aDenominator
+	the direction of image denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsImgDirection(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0011[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps geodetic survey data used tag value of the metadata. 
+
+@param aGpsMapDatum
+	the geodetic survey data used value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsMapDatum(HBufC8* aGpsMapDatum)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0012[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsMapDatum);
+	}
+
+/**
+Sets the gps reference for latitude of destination tag value of the metadata. 
+
+@param aGpsDestLatitudeRef
+	the reference for latitude of destination value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestLatitudeRef(HBufC8* aGpsDestLatitudeRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0013[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsDestLatitudeRef);
+	}
+
+/**
+Sets the gps latitude of destination tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees latitude of destination numerator value
+@param aDegDenominator
+	on return, the degrees latitude of destination denominator value
+@param aMinNumerator
+	on return, the minutes latitude of destination numerator value
+@param aMinDenominator
+	on return, the minutes latitude of destination denominator value
+@param aSecNumerator
+	on return, the seconds latitude of destination numerator value
+@param aSecDenominator
+	on return, the seconds latitude of destination denominator value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestLatitude(TInt aDegNumerator, TInt aDegDenominator, TInt aMinNumerator, TInt aMinDenominator, TInt aSecNumerator, TInt aSecDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0014[ETagValue];
+	TInt count = KTagGPS0014[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	const TRational degs={aDegNumerator, aDegDenominator};
+	const TRational mins={aMinNumerator, aMinDenominator};
+	const TRational secs={aSecNumerator, aSecDenominator};
+	
+	TRAPD(insertErr,
+		param->InsertL(0, degs);
+		param->InsertL(1, mins);
+		param->InsertL(2, secs); );
+	if (insertErr!=KErrNone)
+		{
+		delete param;
+		return insertErr;
+		}
+		
+	TInt result = iExifWrite->SetRationalArrayParam(tag, ifd, *param);		
+
+	delete param;
+	return result;		
+	}
+
+/**
+Sets the gps reference for longitude of destination tag value of the metadata. 
+
+@param aGpsDestLongitudeRef
+	the reference for longitude of destination value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestLongitudeRef(HBufC8* aGpsDestLongitudeRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0015[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsDestLongitudeRef);
+	}
+
+/**
+Sets the gps longitude of destination tag value of the metadata. 
+
+@param aDegNumerator
+	on return, the degrees longitude of destination numerator value
+@param aDegDenominator
+	on return, the degrees longitude of destination denominator value
+@param aMinNumerator
+	on return, the minutes longitude of destination numerator value
+@param aMinDenominator
+	on return, the minutes longitude of destination denominator value
+@param aSecNumerator
+	on return, the seconds longitude of destination numerator value
+@param aSecDenominator
+	on return, the seconds longitude of destination denominator value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestLongitude(TInt aDegNumerator, TInt aDegDenominator, TInt aMinNumerator, TInt aMinDenominator, TInt aSecNumerator, TInt aSecDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0016[ETagValue];
+	TInt count = KTagGPS0016[EComponentCountValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	CArrayFixFlat<TRational>* param = new CArrayFixFlat<TRational>(count);
+	if (param == NULL)
+		{
+		return KErrNoMemory;
+		}
+
+	const TRational degs={aDegNumerator, aDegDenominator};
+	const TRational mins={aMinNumerator, aMinDenominator};
+	const TRational secs={aSecNumerator, aSecDenominator};
+	
+	TRAPD(insertErr,
+		param->InsertL(0, degs);
+		param->InsertL(1, mins);
+		param->InsertL(2, secs); );
+	if (insertErr!=KErrNone)
+		{
+		delete param;
+		return insertErr;
+		}
+		
+	TInt result = iExifWrite->SetRationalArrayParam(tag, ifd, *param);		
+
+	delete param;
+	return result;		
+	}
+
+/**
+Sets the gps reference for bearing of destination tag value of the metadata. 
+
+@param aGpsDestBearingRef
+	the reference for bearing of destination value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestBearingRef(HBufC8* aGpsDestBearingRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0017[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsDestBearingRef);
+	}
+
+/**
+Sets the gps bearing of destination tag value of the metadata. 
+
+@param aNumerator
+	the bearing of destination numerator value
+@param aDenominator
+	the bearing of destination denominator value
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestBearing(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0018[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the gps reference for distance to destination tag value of the metadata. 
+
+@param aGpsDestDistanceRef
+	the reference for distance to destination value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestDistanceRef(HBufC8* aGpsDestDistanceRef)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS0019[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	return iExifWrite->SetParam8(tag, ifd, aGpsDestDistanceRef);
+	}
+
+/**
+Sets the gps distance to destination tag value of the metadata. 
+
+@param aNumerator
+	the distance to destination numerator value.
+@param aDenominator
+	the distance to destination denominator value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDestDistance(TInt aNumerator, TInt aDenominator)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001A[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetRationalParam(tag, ifd, aNumerator, aDenominator);
+	}
+
+/**
+Sets the name of gps processing method tag value of the metadata. 
+
+@param aGpsProcessingMethod
+	the name of gps processing method value.
+	
+	Note: According to the Exif 2.2 specification, the first 8 bytes of aGpsProcessingMethod must contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsProcessingMethod(HBufC8* aGpsProcessingMethod)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001B[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsProcessingMethod);
+	}
+
+/**
+Sets the name of gps area tag value of the metadata. 
+
+@param aGpsAreaInformation
+	the name of gps area value.
+	
+	Note: According to the Exif 2.2 specification, the first 8 bytes of aGpsAreaInformation must contain a Character Code to indicate the type of encoding used. See table 6 of the Exif 2.2 specification for a list of codes.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsAreaInformation(HBufC8* aGpsAreaInformation)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001C[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetParam8(tag, ifd, aGpsAreaInformation);
+	}
+
+/**
+Sets the gps date tag value of the metadata. 
+
+@param aDateStamp
+	the gps date value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDateStamp(HBufC8* aDateStamp)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001D[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+
+	return iExifWrite->SetParam8(tag, ifd, aDateStamp);
+	}
+
+/**
+Sets the gps differential correction tag value of the metadata. 
+
+@param aGpsDifferential
+	the gps differential correction value.
+	
+@return error code
+	KErrArgument if the requested data type does not match with the tag.
+	KErrNotSupported if called on an encoding module.
+	KErrNotFound if the tag cannot be found.
+	KErrOverflow if there is an internal error with the Exif metadata.
+*/
+EXPORT_C TInt TExifWriterUtility::SetGpsDifferential(TUint16 aGpsDifferential)
+	{
+	if(iExifWrite==NULL)
+		{
+		return KErrOverflow;
+		}
+	TInt tag = KTagGPS001E[ETagValue];
+
+	// We need to specify GPS sub IFD using the upper 16 bits.
+	TUint ifd = KExifGpsIfd;
+	
+	return iExifWrite->SetShortParam(tag, ifd, aGpsDifferential);
+	}
+